author: Lutfia Husna Khoirunnisa
(https://www.linkedin.com/in/lutfiahusnakhoirunnisa)
Introduction to the project:
Pada satu tahun terakhir ini, kasus covid-19 di dunia sudah cukup menurun. Banyak aktivitas yang sebelumnya tidak dapat dilakukan karena adanya pandemi covid-19 kini telah mulai berjalan kembali, salah satu aktivitas yang kini sudah mulai banyak dilakukan adalah traveling. Dengan mulai bergeraknya kembali industri pariwisata, para pebisnis mulai kembali melirik sektor tersebut untuk mengambil peluang sebesar-besarnya. Salah satu bisnis yang sedang naik saat ini adalah bisnis Airbnb.
Airbnb merupakan suatu online market platform yang dapat digunakan untuk memasarkan maupun mencari penginapan. Dengan adanya Airbnb ini tentu sangat memudahkan wisatawan untuk mencari penginapan saat melakukan traveling, dan juga memudahkan pemilik penginapan untuk memasarkan penginapannya.
Saat seorang pebisnis akan membangun suatu usaha penginapan di Airbnb, perlu untuk melakukan riset bagaimana pasar dan kompetitor agar dapat menentukan strategi yang tepat untuk diterapkan agar memperoleh keuntungan maksimal. Tentunya strategi yang tepat akan berpengaruh pada tingginya kegiatan penyewaan.
Pada project ini akan dilakukan analisa data yang diperoleh di Airbnb di Singapura pada tahun 2018 hingga 2022 untuk menggali insight yang kemudian dapat digunakan untuk mendapatkan suatu business recommendation untuk pebisnis yang ingin mengembangkan usaha penginapan di Singapura.
</p>
Project goals:
Dilakukan analisis untuk memberikan gambaran kepada calon pebisnis mengenai penginapan yang ada di Singapura, agar dapat menetapkan strategi yang tepat untuk memberikan keuntungungan maksimal.
Pada project ini akan digunakan 3 dataset yaitu Airbnb Listing, Listings Reviews History, dan Neighborhood Mapping
# Data importing
import pandas as pd
listing = pd.read_csv('Dataset/DQLab_listings.csv', sep = ',')
nbhood = pd.read_csv('Dataset/DQLab_nieghbourhood.csv', sep = ',')
rvw = pd.read_csv('Dataset/DQLab_reviews.csv', sep = ',')
#listing info
print(listing.info())
print('\n Banyak missing data pada dataset :', listing.isna().sum().sum())
print('\n Banyak duplicated data pada dataset :', listing.duplicated().sum().sum())
<class 'pandas.core.frame.DataFrame'> RangeIndex: 4161 entries, 0 to 4160 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Unnamed: 0 4161 non-null int64 1 id 4161 non-null int64 2 name 4161 non-null object 3 host_id 4161 non-null int64 4 host_name 4161 non-null object 5 neighbourhood 4161 non-null object 6 latitude 4161 non-null float64 7 longitude 4161 non-null float64 8 room_type 4161 non-null object 9 price 4161 non-null int64 10 minimum_nights 4161 non-null int64 11 availability_365 4161 non-null int64 dtypes: float64(2), int64(6), object(4) memory usage: 390.2+ KB None Banyak missing data pada dataset : 0 Banyak duplicated data pada dataset : 0
Dataset Airbnb Listing memiliki 12 kolom, dan 4161 baris data. Dataset ini tidak memiliki missing value maupun duplicated data.
Berikut merupakan uraian dari masing-masing kolom:
Berikut merupakan deskripsi statistik dari dataset Airbnb Listing:
listing.describe()
| Unnamed: 0 | id | host_id | latitude | longitude | price | minimum_nights | availability_365 | |
|---|---|---|---|---|---|---|---|---|
| count | 4161.000000 | 4.161000e+03 | 4.161000e+03 | 4161.000000 | 4161.000000 | 4161.000000 | 4161.000000 | 4161.000000 |
| mean | 2080.000000 | 1.354784e+17 | 1.559857e+08 | 1.344527 | 103.815150 | 214.505167 | 57.566931 | 247.704158 |
| std | 1201.321564 | 2.653249e+17 | 1.356249e+08 | 0.066965 | 0.065450 | 454.921421 | 65.746522 | 132.564024 |
| min | 0.000000 | 5.064600e+04 | 2.366600e+04 | 1.248260 | 103.635300 | 0.000000 | 1.000000 | 0.000000 |
| 25% | 1040.000000 | 2.507292e+07 | 4.187059e+07 | 1.296100 | 103.769550 | 60.000000 | 1.000000 | 126.000000 |
| 50% | 2080.000000 | 3.990020e+07 | 1.367001e+08 | 1.313930 | 103.840400 | 120.000000 | 92.000000 | 322.000000 |
| 75% | 3120.000000 | 5.319607e+07 | 2.388916e+08 | 1.414620 | 103.855030 | 235.000000 | 92.000000 | 361.000000 |
| max | 4160.000000 | 7.208120e+17 | 4.804050e+08 | 1.488000 | 103.977662 | 12494.000000 | 1000.000000 | 365.000000 |
Berikut merupakan sample dari dataset Airbnb Listing:
display(listing.head())
| Unnamed: 0 | id | name | host_id | host_name | neighbourhood | latitude | longitude | room_type | price | minimum_nights | availability_365 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 50646 | Pleasant Room along Bukit Timah | 227796 | Sujatha | Bukit Timah | 1.33432 | 103.78521 | Private room | 80 | 92 | 365 |
| 1 | 1 | 71609 | Ensuite Room (Room 1 & 2) near EXPO | 367042 | Belinda | Tampines | 1.34537 | 103.95887 | Private room | 145 | 92 | 340 |
| 2 | 2 | 71896 | B&B Room 1 near Airport & EXPO | 367042 | Belinda | Tampines | 1.34754 | 103.95958 | Private room | 85 | 92 | 265 |
| 3 | 3 | 71903 | Room 2-near Airport & EXPO | 367042 | Belinda | Tampines | 1.34531 | 103.96100 | Private room | 85 | 92 | 365 |
| 4 | 4 | 275344 | 15 mins to Outram MRT Single Room | 1439258 | Kay | Bukit Merah | 1.28836 | 103.81144 | Private room | 49 | 60 | 296 |
Listing Dataset Distribution
import plotly.express as px
fig_dist1 = px.box(data_frame=listing, x = 'availability_365', width = 500, height=200)
display(fig_dist1)
fig_dist2 = px.box(data_frame=listing, x = 'minimum_nights', width = 500, height=200)
display(fig_dist2)
fig_dist3 = px.box(data_frame=listing, x = 'price', width = 500, height=200)
display(fig_dist3)
Dari boxplot, terlihat pada kolom minimum_night terdapat data yang tidak normal, dimana terdapat kamar yang minimal lama sewa lebih dari 365 malam atau lebih dari 1 tahun. Data tersebut akan dihapus karena mungkin terjadi kesalahan dalam pendataan minimum lama sewa, atau kamar tersebut bukan merupakan kamar penginapan tetapi apartemen yang disewakan untuk tempat tinggal.
Dan dari boxplot harga, terlihat bahwa terdapat kamar yang memiliki harga sewa 0. Data tersebut perlu kita hapus dari dataset karena terdapat kemungkinan kesalahan pendataan, atau kamar tersebut memang bukan disewakan secara komersil.
listing = listing[listing['minimum_nights']<=365].reset_index()
fig_dist2 = px.box(data_frame=listing, x = 'minimum_nights', width = 500, height=200)
display(fig_dist2)
listing = listing[listing['price']>0].reset_index()
fig_dist3 = px.box(data_frame=listing, x = 'price', width = 500, height=200)
display(fig_dist3)
Selanjutnya akan dilihat bagaimana penyebaran kamar Airbnb di Singapura beradarkan tempatnya.
fig_map = px.scatter_mapbox(listing, lat="latitude", lon="longitude", hover_name='id',zoom=9, height=300, width=400)
fig_map.update_layout(mapbox_style="open-street-map")
fig_map.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig_map.show()
Dari plot peta tersebut, diketahui banyak kamar Airbnb yang di luar Singapura tetapi masuk ke dalam daftar, sehingga data kamar di luar Singapura tersebut perlu untuk dihapus.
Untuk menghapus data kamar di luar Singapura, dilakukan pembersihan secara manual dengan melihat latitude dan longitude kamar.
listing = listing[listing['latitude']<1.45328] #hapus tempat yang memiliki latitude lebih dari 1.45328(di sebelah utara Singapura)
#hapus tempat yang berada lebih dari barat laut Singapura
outer_place_index = listing[ (listing['latitude'] > 1.405) & (listing['longitude'] < 103.664) ].index
listing.drop(outer_place_index , inplace=True)
#hapus tempat yang masih berada di luar Singapura
outer_id_index = listing[listing['id'].isin([708999801528964619,39732595,39757287,28268681,29171020,27248990,27532454,540170321699689740])].index
listing.drop(outer_id_index , inplace=True)
#Map plot after cleaning
fig_map2 = px.scatter_mapbox(listing, lat="latitude", lon="longitude", hover_name='name',zoom=9, height=300, width=500)
fig_map2.update_layout(mapbox_style="open-street-map")
fig_map2.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig_map2.show()
Setelah dilakukan pembersihan data, terlihat bahwa dataset listing yang baru kini telah bebas dari data kamar Airbnb di luar Singapura.
print(f'Kini dataset Listing memiliki {listing.shape[1]} kolom data, dan {listing.shape[0]} baris data ')
Kini dataset Listing memiliki 14 kolom data, dan 3127 baris data
Kini dataset Listing memiliki 12 kolom data, dan 3127 baris data
#Neighborhood Dataset info
rvw.info()
print('\n Banyak missing data pada dataset :', rvw.isna().sum().sum())
print('\n Banyak duplicated data pada dataset :', rvw.duplicated().sum().sum())
<class 'pandas.core.frame.DataFrame'> RangeIndex: 49695 entries, 0 to 49694 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Unnamed: 0 49695 non-null int64 1 listing_id 49695 non-null int64 2 date 49695 non-null object dtypes: int64(2), object(1) memory usage: 1.1+ MB Banyak missing data pada dataset : 0 Banyak duplicated data pada dataset : 0
Dataset Listings Reviews History memiliki 3 kolom, dan 49695 baris data. Dataset ini tidak memiliki missing value maupun duplicated data.
Berikut merupakan uraian dari masing-masing kolom:
Berikut merupakan data sample dari dataset Listings Reviews History:
display(rvw.head())
| Unnamed: 0 | listing_id | date | |
|---|---|---|---|
| 0 | 28 | 71609 | 2018-07-14 |
| 1 | 29 | 71609 | 2019-01-06 |
| 2 | 30 | 71609 | 2019-07-27 |
| 3 | 31 | 71609 | 2019-08-11 |
| 4 | 32 | 71609 | 2019-09-07 |
Karena terdapat beberapa kamar Airbnb di Singapura yang dihapus dari daftar karena tidak memenuhi ketentuan, maka dataset review juga perlu untuk dibersihkan dari data kamar yang dihapus dari dataset Listing.
rvw = rvw[rvw['listing_id'].isin(listing['id']) == True]
print(f'Kini dataset Listing memiliki {rvw.shape[1]} kolom data, dan {rvw.shape[0]} baris data ')
Kini dataset Listing memiliki 3 kolom data, dan 22482 baris data
display(rvw.head())
| Unnamed: 0 | listing_id | date | |
|---|---|---|---|
| 0 | 28 | 71609 | 2018-07-14 |
| 1 | 29 | 71609 | 2019-01-06 |
| 2 | 30 | 71609 | 2019-07-27 |
| 3 | 31 | 71609 | 2019-08-11 |
| 4 | 32 | 71609 | 2019-09-07 |
Dari data sample tersebut, terlihat bahwa dataset belum terurut berdasarkan tanggal. Untuk mempermudah dalam melakukan analisis Data, maka akan diurutkan berdasarkan tanggal.
rvw = rvw.sort_values('date')
display(rvw.head())
display(rvw.tail())
| Unnamed: 0 | listing_id | date | |
|---|---|---|---|
| 11562 | 20103 | 21937326 | 2018-01-01 |
| 255 | 895 | 756267 | 2018-01-01 |
| 3284 | 7097 | 8180346 | 2018-01-01 |
| 9492 | 17727 | 18674998 | 2018-01-01 |
| 6370 | 13288 | 13254555 | 2018-01-01 |
| Unnamed: 0 | listing_id | date | |
|---|---|---|---|
| 42381 | 50936 | 47945468 | 2022-09-22 |
| 1221 | 2825 | 4008423 | 2022-09-22 |
| 49539 | 58094 | 685737890066148570 | 2022-09-22 |
| 37566 | 46121 | 42079889 | 2022-09-22 |
| 49477 | 58032 | 682352208578700102 | 2022-09-22 |
#Neighborhood Dataset info
nbhood.info()
print('\n Banyak missing data pada dataset :', nbhood.isna().sum().sum())
print('\n Banyak duplicated data pada dataset :', nbhood.duplicated().sum().sum())
<class 'pandas.core.frame.DataFrame'> RangeIndex: 55 entries, 0 to 54 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Unnamed: 0 55 non-null int64 1 neighbourhood_group 55 non-null object 2 neighbourhood 55 non-null object dtypes: int64(1), object(2) memory usage: 1.4+ KB Banyak missing data pada dataset : 0 Banyak duplicated data pada dataset : 0
Pada dataset Neighborhood Mapping terdapat 3 kolom dan 55 row data. Berikut merupakan uraian dari masing-masing kolom:
Berikut merupakan sample dari dataset Neighborhood Mapping:
display(nbhood.head())
| Unnamed: 0 | neighbourhood_group | neighbourhood | |
|---|---|---|---|
| 0 | 0 | Central Region | Bishan |
| 1 | 1 | Central Region | Bukit Merah |
| 2 | 2 | Central Region | Bukit Timah |
| 3 | 3 | Central Region | Downtown Core |
| 4 | 4 | Central Region | Geylang |
Sebelum melakukan analisis distribusi lebih lanjut, kita perlu untuk membentuk suatu tabel baru yang memuat data id, neighbourhood_group, neighbourhood, minimum nights, price, dan berapa hari dalam setahun suatu kamar disewa. Hal ini dilakukan dengan melakukan merging atau join tabel Airbnb Listing dan Neighborhood Mapping.
listing_nbgroup = pd.merge(nbhood, listing, on = 'neighbourhood')
listing_nbgroup = listing_nbgroup[['id', 'name','neighbourhood_group','neighbourhood','room_type','longitude','latitude','minimum_nights','price', 'availability_365']]
listing_nbgroup['rented_365'] = 365 - listing_nbgroup['availability_365']
listing_nbgroup.head()
| id | name | neighbourhood_group | neighbourhood | room_type | longitude | latitude | minimum_nights | price | availability_365 | rented_365 | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 4926170 | Room 4B in Terrace House @ Thomson Village | Central Region | Bishan | Private room | 103.83274 | 1.35349 | 92 | 47 | 356 | 9 |
| 1 | 11128602 | Luxury 3 bedroom condo. 1389sqf | Central Region | Bishan | Entire home/apt | 103.83075 | 1.36628 | 180 | 200 | 365 | 0 |
| 2 | 13243736 | Charming 2Bed-2Bath- Parking Full Apartment | Central Region | Bishan | Entire home/apt | 103.82800 | 1.35725 | 92 | 209 | 330 | 35 |
| 3 | 19438458 | Modern zen bungalow in upper thomson | Central Region | Bishan | Private room | 103.82808 | 1.35732 | 92 | 330 | 0 | 365 |
| 4 | 20865016 | Lush Green Neighborhood Private Room | Central Region | Bishan | Private room | 103.83001 | 1.35751 | 92 | 50 | 363 | 2 |
Kemudian dibentuk juga suatu dataset baru yang memuat data tanggal suatu kamar direview, id, name, room_typem neighbourhood, neighbourhood_group, price, dan lama kamar tersewa dalam satu tahunnya.
id
listing_reviews = pd.merge(rvw, listing, left_on = 'listing_id', right_on = 'id' )
listing_reviews = pd.merge(listing_reviews, nbhood, on = 'neighbourhood')
listing_reviews = listing_reviews[['date', 'id', 'name', 'room_type', 'neighbourhood', 'neighbourhood_group', 'price', 'minimum_nights','availability_365']]
listing_reviews['rented_365'] = 365 - listing_reviews['availability_365']
listing_reviews['month'] = pd.to_datetime(listing_reviews['date']).dt.month
listing_reviews['year'] = pd.to_datetime(listing_reviews['date']).dt.year
listing_reviews.head()
| date | id | name | room_type | neighbourhood | neighbourhood_group | price | minimum_nights | availability_365 | rented_365 | month | year | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2018-01-01 | 21937326 | Master bed room - 5 mins ride to CBD | Private room | Geylang | Central Region | 500 | 180 | 90 | 275 | 1 | 2018 |
| 1 | 2018-01-01 | 21937326 | Master bed room - 5 mins ride to CBD | Private room | Geylang | Central Region | 500 | 180 | 90 | 275 | 1 | 2018 |
| 2 | 2018-02-18 | 21937326 | Master bed room - 5 mins ride to CBD | Private room | Geylang | Central Region | 500 | 180 | 90 | 275 | 2 | 2018 |
| 3 | 2018-04-01 | 21937326 | Master bed room - 5 mins ride to CBD | Private room | Geylang | Central Region | 500 | 180 | 90 | 275 | 4 | 2018 |
| 4 | 2018-09-16 | 21937326 | Master bed room - 5 mins ride to CBD | Private room | Geylang | Central Region | 500 | 180 | 90 | 275 | 9 | 2018 |
room_type_pie = px.pie(listing, values=listing['room_type'].value_counts().values, color=listing['room_type'].value_counts().index, names=listing['room_type'].value_counts().index, color_discrete_sequence=["#97DECE","#7F167F","#FF597B","#ADE792"], hole=0.5)
room_type_pie.update_traces(textposition="outside", textfont=dict(color="black",size=13), textinfo="label+percent",pull=[0.1,0,0,0,0],rotation = -115)
room_type_pie.update_layout(title="<b>Listing distribution by Room_type</b>", title_font=dict(size=16))
room_type_pie
Jenis kamar di Airbnb yang paling banyak di Singapura adalah Entire home/apt sebesar 47.4% dari total kamar, yang diikuti oleh Private room sebesar 44.6% dari total kamar.
Akan dicari 10 neighbourhood yang menyediakan kamar di Airbnb terbanyak:
top_nbhood = listing_nbgroup.groupby(['neighbourhood_group', 'neighbourhood']).agg(count=('neighbourhood','count')).sort_values(by=['count'],ascending=False).reset_index().head(10)
display(top_nbhood)
| neighbourhood_group | neighbourhood | count | |
|---|---|---|---|
| 0 | Central Region | Kallang | 384 |
| 1 | Central Region | Downtown Core | 321 |
| 2 | Central Region | Outram | 258 |
| 3 | Central Region | Rochor | 213 |
| 4 | Central Region | Novena | 195 |
| 5 | Central Region | Queenstown | 186 |
| 6 | Central Region | Bukit Merah | 165 |
| 7 | Central Region | Geylang | 162 |
| 8 | Central Region | River Valley | 141 |
| 9 | East Region | Bedok | 122 |
top_nbhood_plot = px.bar(top_nbhood, x = 'count', y = 'neighbourhood', color = 'neighbourhood_group', orientation = 'h', width = 750 )
top_nbhood_plot.update_layout(title="<b>Top 10 Neighbourhood with the most rooms</b>", title_font=dict(size=16))
top_nbhood_plot.update_layout(yaxis={'categoryorder':'total ascending'})
top_nbhood_plot
Selanjutnya akan dicari 5 host yang menyediakan kamar terbanyak di Airbnb Singapura
listing.groupby(['host_id', 'host_name']).agg(count=('neighbourhood','count')).sort_values(by=['count'],ascending=False).reset_index().head(5)
| host_id | host_name | count | |
|---|---|---|---|
| 0 | 138649185 | Fiona | 217 |
| 1 | 156409670 | Tia | 180 |
| 2 | 66406177 | Jay | 143 |
| 3 | 2413412 | Kaurus | 97 |
| 4 | 238891646 | Neha | 88 |
Daftar host yang menyediakan kamar terbanyak adalah Fiona, Tia, Jay, Kaurus, dan Neha.
Dari tabel baru tersebut, akan dicari distribusi kamar tersedia di Neighbourhood group di Singapura.
nbg_pie = px.pie(listing_nbgroup, values=listing_nbgroup['neighbourhood_group'].value_counts().values, color=listing_nbgroup['neighbourhood_group'].value_counts().index, names=listing_nbgroup['neighbourhood_group'].value_counts().index, color_discrete_sequence=["#97DECE","#7F167F","#FF597B","#C58940","#ADE792"], hole=0.5, width = 750)
nbg_pie.update_traces(textposition="outside", textfont=dict(color="black",size=13), textinfo="label+percent",pull=[0.1,0,0,0,0],rotation = -115)
nbg_pie.update_layout(title="<b>Listing distribution by Neighbourhood Group</b>", title_font=dict(size=16))
nbg_pie.show()
Diketahui neighbourhood_group yang menyediakan kamar terbanyak di Airbnb Singapura adalah Central Region yang menyediakan 2550 kamar di Airbnb, dimana angka tersebut adalah 81.5% dari total keseluruhan kamar yang tersedia di Airbnb Singapura. Berikut adalah sebaran kamar jika dilihat dari map:
import plotly.express as px
listing_map = px.scatter_mapbox(listing_nbgroup, lat="latitude", lon="longitude", color="neighbourhood_group", hover_name="neighbourhood_group", zoom=9, width=750, color_discrete_sequence=["#2B3A55","#CE7777","#810CA8","#9C254D","#C060A1"])
listing_map.update_layout(mapbox_style="open-street-map")
listing_map.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
listing_map.show()
Penginapan yang disediakan di Airbnb Singapura menyebar di seluruh wilayah Singapura, tetapi penginapan paling banyak berada pada Central Region. Central Region sendiri merupakan pusat bisnis dan hiburan di Singapura, sehingga pembangunan penginapan di sini sangat menjanjikan untuk dijadikan tempat untuk berbisnis penyewaan penginapan di Singapura. Tetapi tentu dengan banyaknya penginapan di Central Region, tentu persaingan dengan kompetitor akan semakin ketat, maka perlu untuk merancang strategi yang baik untuk lebih unggul dari kompetitor.
Strategi yang baik sangat diperlukan untuk unggul dalam persaingan, contohnya seperti mengembangkan konsep penginapan yang unik untuk menarik pengunjung, memperkuat marketing, dan fokus pada kualitas layanan serta kualitas kamar yang disewakan. Letak penginapan yang strategis juga perlu dipertimbangkan, karena letak penginapan merupakan salah satu faktor yang paling berpengaruh pada aktivitas penyewaan.
price_mean = listing['price'].mean()
price_max = listing['price'].max()
price_min = listing['price'].min()
print(f'Rata rata harga penginapan di Singapura adalah {price_mean:.2f}')
print(f'dengan harga terendah sebesar {price_min:.2f}')
print(f'dan harga tertinggi sebesar {price_max:.2f}')
import plotly.express as px
price_dist = px.box(listing, x='price')
price_dist.show()
Rata rata harga penginapan di Singapura adalah 247.55 dengan harga terendah sebesar 13.00 dan harga tertinggi sebesar 10286.00
Harga persewaan kamar di Airbnb Singapura memiliki rata rata sebesar 247.55, dengan range 13 hingga 10286.00.
Berikut merupakan map plotting dari harga penyewaan kamar di Singapura.
import plotly.express as px
price_map = px.scatter_mapbox(listing_nbgroup, lat="latitude", lon="longitude", color="price", hover_name="neighbourhood_group", zoom=9, width=750)
price_map.update_layout(mapbox_style="open-street-map")
price_map.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
price_map.show()
Dari mapping plot harga tersebut, diketahui bahwa mayoritas dari penyewa penginapan di Airbnb memberikan harga dibawah 2000. Distribusi harga ini menyebar, dan tidak bergantung pada dimana letak dari penginapan tersebut. Sehingga dapat dikatakan bahwa posisi penginapan tidak berkorelasi dengan harga yang diberikan oleh penyewa. Pemberian harga ini kemungkinan lebih bergantung pada fasilitas apa saja yang disediakan oleh penginapan dan juga bergantung pada kelas dari penginapan.
Dengan tabel listing_nbgroup yang baru dibentuk, kita kemudian akan melakukan analisis distribusi dari harga pada tiap neighbourhood group
listing_nbgroup.groupby('neighbourhood_group').agg(price_mean=('price','mean')).sort_values(by=['price_mean'],ascending=False).reset_index()
| neighbourhood_group | price_mean | |
|---|---|---|
| 0 | Central Region | 253.196155 |
| 1 | North Region | 241.963415 |
| 2 | West Region | 233.147321 |
| 3 | East Region | 216.888889 |
| 4 | North-East Region | 193.386139 |
Diketahui bahwa neighbourhood group yang memiliki rata-rata harga tertinggi di Singapura adalah Central Region dengan rata-rata harga penyewaan kamarnya adalah 253.19.
Selanjutnya akan divisualisasikan distribusi dari harga pada tiap neighbourhood group:
price_by_nbg_dist = px.box(listing_nbgroup, x='price', y='neighbourhood_group', color='neighbourhood_group' )
price_by_nbg_dist.show()
listing_nbgroup[listing_nbgroup['price']==listing_nbgroup['price'].max()]
| id | name | neighbourhood_group | neighbourhood | room_type | longitude | latitude | minimum_nights | price | availability_365 | rented_365 | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 3122 | 20791161 | YOUR entire PRIVATE LUXURY PENTHOUSE condo unit | West Region | Tuas | Entire home/apt | 103.64828 | 1.31947 | 92 | 10286 | 89 | 276 |
Diketahui bahwa harga penyewaan kamar tertinggi berada pada West Region, yaitu pada kamar dengan id 20791161 yang berada pada Tuas, dengan banyak hari tersewa pada satu tahun selama 276 hari.
price_by_roomtype = listing_nbgroup.groupby('room_type').agg(price_mean=('price','mean')).sort_values(by=['price_mean'],ascending=False).reset_index()
price_by_roomtype
| room_type | price_mean | |
|---|---|---|
| 0 | Entire home/apt | 350.015054 |
| 1 | Hotel room | 170.507576 |
| 2 | Private room | 168.146999 |
| 3 | Shared room | 119.170940 |
price_by_roomtype_plot = px.histogram(price_by_roomtype, x = 'room_type', y = 'price_mean', color = 'room_type', width = 750)
price_by_roomtype_plot.update_layout(title="<b>Price mean of each Room Type</b>", title_font=dict(size=16), yaxis_title = 'price_mean')
price_by_roomtype_plot
Pada Airbnb di Singapura, jenis kamar yang memiliki rata-rata harga tertinggi adalah Entire Home/Apt, tentu ini sesuai dengan fasilitas yang diberikan pada Tipe kamar ini.
rented_mean = listing_nbgroup['rented_365'].mean()
print(f'Rata rata penginapan di Singapura tersewa selama {rented_mean:.2f} hari tiap tahunnya')
import plotly.express as px
rented_365_dist = px.box(listing_nbgroup, x='rented_365')
rented_365_dist.show()
Rata rata penginapan di Singapura tersewa selama 115.42 hari tiap tahunnya
Rata rata penginapan di Singapura tersewa selama 115 hari tiap tahunnya.
Berikut merupakan sebaran lama kamar tersewa pada satu tahun di Singapura
import plotly.express as px
rented_365_map = px.scatter_mapbox(listing_nbgroup, lat="latitude", lon="longitude", color="rented_365", hover_name='neighbourhood_group',zoom=9, width=750)
rented_365_map.update_layout(mapbox_style="open-street-map")
rented_365_map.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
rented_365_map.show()
Pada mapping plot tersebut diketahui bahwa distribusi lama suatu kamar penginapan tersewa dalam satu tahun menyebar dan tidak bergantung pada letak penginapan. Dapat dilihat bahwa di daerah North-east Region memiliki sedikit penginapan yang disewakan, tetapi mayoritas memiliki lama penginapan tersewa yang cenderung tinggi. Pada Central Region, terlihat sangat banyak penginapan yang disewakan tetapi memiliki lama penginapan tersewa dalam satu tahun yang mayoritas relatif rendah. Hal ini mungkin terjadi karena banyaknya pilihan penginapan yang tersedia di kawasan Central Region, menjadikan turis lebih sering berpindah pindah penginapan sehingga menyebabkan lama penginapan tersewa dalam satu tahun cenderung rendah.
Kemudian, akan dilihat bagaimana distribusi lama kamar tersewa dalam satu tahun pada tiap neighbourhood group secara statistik
listing_nbgroup.groupby('neighbourhood_group').agg(mean_days_rented=('rented_365','mean')).sort_values(by=['mean_days_rented'],ascending=False).reset_index()
| neighbourhood_group | mean_days_rented | |
|---|---|---|
| 0 | North-East Region | 169.821782 |
| 1 | East Region | 159.730994 |
| 2 | West Region | 159.348214 |
| 3 | North Region | 155.670732 |
| 4 | Central Region | 105.141232 |
Diketahui bahwa neighbourhood group dengan rata-rata lama kamar tersewa tertinggi pada North-East Region dengan rata-rata kamarnya tersewa selama 169 hari dalam setahun.
Selanjutnya, kita perlu mengetahui dimana neighbourhood yang memiliki rata-rata lama kamar tersewa tertinggi di Singapura.
listing_nbgroup_top_rented_365 = listing_nbgroup.groupby(['neighbourhood','neighbourhood_group'])['rented_365'].mean().reset_index().sort_values('rented_365', ascending = False).head(10)
display(listing_nbgroup_top_rented_365)
| neighbourhood | neighbourhood_group | rented_365 | |
|---|---|---|---|
| 17 | Mandai | North Region | 365.000000 |
| 36 | Sungei Kadut | North Region | 365.000000 |
| 26 | Pioneer | West Region | 365.000000 |
| 41 | Western Water Catchment | West Region | 328.666667 |
| 18 | Marina South | Central Region | 292.875000 |
| 32 | Sengkang | North-East Region | 265.555556 |
| 16 | Lim Chu Kang | North Region | 252.000000 |
| 5 | Bukit Panjang | West Region | 234.923077 |
| 13 | Jurong East | West Region | 217.568966 |
| 2 | Bishan | Central Region | 197.789474 |
Untuk melihat gambaran penyewaan kamar Airbnb di Singapura, kita akan melihat bagaimana korelasi dari total_days_rented, minimum_nights, dan price.
display(listing_nbgroup[['rented_365','minimum_nights','price']].corr())
import seaborn as sns
listing_corr1 = sns.heatmap(listing_nbgroup[['rented_365','minimum_nights','price']].corr(), vmax=1, vmin=-1).set_title('Correlation between room_type and price', fontdict={'fontsize': 15, 'horizontalalignment': 'right'})
listing_corr1
| rented_365 | minimum_nights | price | |
|---|---|---|---|
| rented_365 | 1.000000 | 0.054081 | -0.016187 |
| minimum_nights | 0.054081 | 1.000000 | -0.138348 |
| price | -0.016187 | -0.138348 | 1.000000 |
Text(0.5, 1.0, 'Correlation between room_type and price')
Terlihat dari nilai koefisien korelasi yang mendekati 0, antara total_days_rented, minimum_nights, dan price tidak ada yang memiliki korelasi kuat. Ketiga variable tersebut berkorelasi sangat lemah terhadap satu sama lain.
Berikut merupakan visualisasi dari total_days_rented vs minimum_nights, dan total_days_rented vs price:
rented_365_vs_minimum_nights = px.scatter(data_frame=listing_nbgroup,x='rented_365', y='minimum_nights', color="room_type", trendline="ols", trendline_scope="overall", trendline_color_override="black", template="simple_white", width=750)
rented_365_vs_minimum_nights.update_layout(title="<b>Rented_365 vs Minimum Night</b>",title_font=dict(size=18, color="black"))
rented_365_vs_minimum_nights
Diketahui dari Visualisasi Total_days_rented vs Minimum_night tersebut memang trendline dari kedua variable cenderung membentuk garis lurus, yang berarti korelasi antara dua variable lemah. Sehingga kecil sekali hubungan antara lama suatu kamar tersewa selama satu tahun di Singapura dengan lama minimal penyewaan.
rented_365_vs_price = px.scatter(data_frame=listing_nbgroup,x='rented_365', y='price', color="room_type", trendline="ols", trendline_scope="overall", trendline_color_override="black", template="simple_white", width=750)
rented_365_vs_price.update_layout(title="<b>Rented_365 vs Price</b>",title_font=dict(size=18, color="black"))
rented_365_vs_price
Diketahui dari Visualisasi Total_days_rented vs Price tersebut memang trendline dari kedua variable cenderung membentuk garis lurus, yang berarti korelasi antara dua variable lemah. Sehingga kecil sekali hubungan antara lama suatu kamar tersewa selama satu tahun di Singapura dengan harganya.
Tetapi jika dibandingkan mana variable yang lebih berpengaruh pada lama suatu kamar tersewa dalam satu tahun, minimum_night lebih berpengaruh dibandingkan dengan harga.
Minimum_night dan lama suatu kamar tersewa dalam satu tahun berhubungan korelasi positif, hal ini disebabkan karena tentu semakin lama minimum penyewaan kamar, maka lama kamar tersewa dalam satu tahun lebih banyak juga.
Tentu kita memiliki keterbatasan untuk mendapatkan data aktivitas penyewaan pada tiap penginapan di Airbnb, karena tentu data tersebut bersifat rahasia milik tiap-tiap penyedia penginapan. Tetapi kita dapat melihat bagaimana gambaran umum dari aktivitas penyewaan dengan melihat aktivitas review yang dilakukan oleh customer melalui platform Airbnb. Dengan melihat bagaimana gambaran dari aktivitas review penginapan di Airbnb, kita dapat melihat bagaimana trend penyewaan dari tiap penginapan pada tiap waktunya.
listing_reviews_per_date = listing_reviews.groupby('date').agg(count=('date','count')).sort_values(by=['date']).reset_index()
listing_reviews_per_month = listing_reviews.groupby('month').agg(count=('month','count')).sort_values(by=['month']).reset_index()
listing_reviews_per_years = listing_reviews.groupby('year').agg(count=('year','count')).sort_values(by=['year']).reset_index()
rvw_by_date = px.line(listing_reviews_per_date, x='date', y='count',title='Review Trend per Day')
rvw_by_date
rvw_by_month = px.line(listing_reviews_per_month, x='month', y='count',title='Review Trend by Month', markers = True)
rvw_by_month
rvw_by_year = px.line(listing_reviews_per_years, x='year', y='count',title='Review Trend by Year', markers=True, width = 750)
rvw_by_year
Dapat dilihat bahwa banyak review kamar tiap tahunnya melonjak dari 2018 menuju 2019, kemudian turun drastis pada tahun 2020. Hal ini sejalan dengan grafik 'Development of the tourism sector in Singapore from 1995 to 2020' yang dipublikasikan oleh www.worlddata.info, dimana banyak turis yang masuk pada tahun 2019 mengalami kenaikan jika dibandingkan dengan tahun 2018, dan terjadi penurunan drastis pada tahun 2020. Dengan banyak turis yang masuk ini tentu sangat berpengaruh dengan aktivitas review kamar pada Airbnb di Singapura.

img source: https://cdn.worlddata.info/graphs/tourism/arrivals-singapur-930.png
Penurunan aktivitas review kamar berlanjut pada tahun 2021, dimana pada tahun 2021 aktivitas review kamar Airbnb di Singapura merupakan yang paling rendah selama 5 tahun terakhir. Tetapi terjadi kenaikan aktivitas review kamar Airbnb di Singapura pada tahun 2022. Penurunan dan kenaikan ini mungkin disebabkan oleh adanya pandemi covid-19 yang dimulai pada tahun 2020 dan berlangsung hingga awal tahun 2022 yang menyebabkan terbatasnya aktivitas pariwisata di Singapura. Tentu hai ini berakibat pada aktivitas review penginapan Airbnb yang ada di Singapura. Dan pandemi covid-19 ini kasus covid-19 berangsur menurun, sehingga aktivitas review kamar Airbnb kembali naik.
Jika dilihat dari banyak review penginapan per bulannya, pada bulan Desember hingga Januari tiap tahunnya pada 5 tahun terakhir cenderung lebih tinggi aktivitas reviewnya dibandingkan dengan bulan-bulan lain. Hal ini tentu menarik, karena trend ini cenderung berulang pada 5 tahun terakhir.
Selanjutnya, kita akan melihat bagaimana review kamar yang dilakukan pada tiap Neighbourhood Group pada 5 tahun terakhir di Singapura
listing_reviews_by_neighbourhood_group2 = listing_reviews.groupby('neighbourhood_group').agg(count=('neighbourhood_group','count')).sort_values(by=['count'], ascending=False).reset_index()
display(listing_reviews_by_neighbourhood_group2)
| neighbourhood_group | count | |
|---|---|---|
| 0 | Central Region | 18497 |
| 1 | East Region | 2023 |
| 2 | North-East Region | 1028 |
| 3 | West Region | 656 |
| 4 | North Region | 278 |
fig_rvw_nbg = px.bar(listing_reviews_by_neighbourhood_group2, x='neighbourhood_group',y='count', color = 'neighbourhood_group', title='Reviews Trend by Neighbourhood Group')
fig_rvw_nbg.add_hline(y=listing_reviews_by_neighbourhood_group2['count'].mean())
Diketahui dari grafik diatas, hanya Central Region yang memiliki banyak review kamar Airbnb di atas rata-rata. Hal ini terjadi karena memang 81.5% kamar Airbnb yang disewakan di Singapura berada pada Central Region.
Selanjutnya, kita akan melihat bagaimana review kamar yang dilakukan pada tiap tipe kamar pada 5 tahun terakhir di Singapura
listing_reviews_by_room_type2 = listing_reviews.groupby('room_type').agg(count=('room_type','count')).sort_values(by=['count'], ascending=False).reset_index()
display(listing_reviews_by_room_type2)
| room_type | count | |
|---|---|---|
| 0 | Private room | 12417 |
| 1 | Entire home/apt | 7637 |
| 2 | Hotel room | 1708 |
| 3 | Shared room | 720 |
rvw_roomtype = px.bar(listing_reviews_by_room_type2, x='room_type',y='count', color = 'room_type', title='Reviews Trend by Room Type')
rvw_roomtype.add_hline(y=listing_reviews_by_room_type2['count'].mean())
Diketahui bahwa tipe kamar yang memiliki banyak review di atas rata-rata adalah Private room, dan entire home/apt, sehingga dapat diketahui bahwa mungkin dua tipe kamar tersebut adalah tipe kamar yang paling banyak disewa oleh pengguna sehingga memiliki banyak review di atas rata-rata.
rvw_by_room_type_tab = listing_reviews.groupby(['year','room_type']).agg(count=('year','count')).sort_values(by=['year']).reset_index()
rvw_by_room_type = px.line(rvw_by_room_type_tab, x='year', y='count', color = 'room_type' ,title='<b>Review Trend by Year', markers=True, width = 750)
rvw_by_room_type
Pada 5 tahun terakhir, Kamar tipe Private room selalu mendapatkan banyak review terbanyak dibandingkan dengan tipe kamar lain.
rvw_by_neighbourhood = listing_reviews.groupby(['neighbourhood_group','neighbourhood']).agg(count=('neighbourhood','count')).sort_values(by=['count'], ascending=False).reset_index().head(10)
display(rvw_by_neighbourhood)
| neighbourhood_group | neighbourhood | count | |
|---|---|---|---|
| 0 | Central Region | Kallang | 2968 |
| 1 | Central Region | Downtown Core | 2756 |
| 2 | Central Region | Rochor | 2707 |
| 3 | Central Region | Outram | 2599 |
| 4 | Central Region | Geylang | 1722 |
| 5 | Central Region | Bukit Merah | 1270 |
| 6 | East Region | Bedok | 1094 |
| 7 | Central Region | River Valley | 960 |
| 8 | East Region | Tampines | 746 |
| 9 | Central Region | Singapore River | 685 |
rvw_by_neighbourhood_plot = px.bar(rvw_by_neighbourhood, x = 'count', y = 'neighbourhood', color = 'neighbourhood_group', orientation = 'h', width = 750)
rvw_by_neighbourhood_plot.update_layout(title="<b>Top 10 Neighbourhood with the most reviews</b>", title_font=dict(size=16))
rvw_by_neighbourhood_plot.update_layout(yaxis={'categoryorder':'total ascending'})
rvw_by_neighbourhood_plot
Karena memiliki banyak penginapan, Kallang juga mendapatkan akumulasi review penginapan paling banyak di Airbnb Singapura. Kallang memiliki banyak daya tarik bagi wisatawan, seperti Sungai Kallang, dan tempat iconic lain seperti new National Stadium, Kallang Wave Mall, dan Kallang menyediakan banyak fasilitas untuk melakukan aktivitas olahraga sehingga Kallang menjadi tempat yang memiliki daya tarik turis dan menjanjikan untuk dijadikan tempat berbisnis penyewaan penginapan melalui Airbnb.
Berikut merupakan tabel dari 10 daftar kamar di Airbnb Singapura yang memiliki review paling banyak.
listing_reviews.groupby(['id', 'name', 'room_type']).agg(count=('id','count')).sort_values(by=['count'], ascending=False).reset_index().head(10)
| id | name | room_type | count | |
|---|---|---|---|---|
| 0 | 43337094 | Double Room, DAYUSE, 5 hours: 4PM-9PM | Private room | 279 |
| 1 | 47945468 | Single cabin shared bathroom in Tanjong Pagar MRT | Private room | 255 |
| 2 | 4541183 | Boat Quay Studio Premium River View (South bri... | Entire home/apt | 236 |
| 3 | 1024986 | Super Host Apartment | Entire home/apt | 218 |
| 4 | 12484261 | City room 5mins to Haji, near Suntec/MBS/Merlion | Private room | 207 |
| 5 | 21415749 | Luxury Capsule (Single - Mixed) [Kampong Glam] | Hotel room | 206 |
| 6 | 12162272 | Great location. A spacious, well equipped home. | Entire home/apt | 184 |
| 7 | 24659042 | Cosy Studio Apartment 2 at Heritage Tiong Bahru | Entire home/apt | 181 |
| 8 | 42417293 | Double Room, SHORT OVERNIGHT, 8 hours: 11PM-7AM | Private room | 179 |
| 9 | 16891958 | Apt Room 5mins to Haji, near MBS/Suntec/Sportshub | Private room | 169 |
listing_by_room = listing_reviews.groupby(['id','minimum_nights','name','neighbourhood','neighbourhood_group','price','rented_365','room_type']).agg(review_num=('date','count')).sort_values(by=['review_num'], ascending=False).reset_index()
import plotly.graph_objects as go
import numpy as np
listing_corr2 = go.Figure()
listing_corr2.add_trace(
go.Heatmap(
x = listing_by_room[['price','minimum_nights','rented_365','review_num']].corr().columns,
y = listing_by_room[['price','minimum_nights','rented_365','review_num']].corr().index,
z = np.array(listing_by_room[['price','minimum_nights','rented_365','review_num']].corr()),
text=listing_by_room[['price','minimum_nights','rented_365','review_num']].corr().values,
texttemplate='%{text:.4f}',
colorscale=px.colors.sequential.Sunset
)
)
listing_corr2.update_layout(width = 750)
listing_corr2.show()
Terlihat dari nilai koefisien korelasi yang mendekati 0, antara minimal lama menyewa, harga, lama suatu kamar tersewa dalam satu tahun, dan banyak review tidak ada yang memiliki korelasi kuat. Ketiga variable tersebut berkorelasi sangat lemah terhadap satu sama lain. Tetapi diantara korelasi variable-variable tersebut, korelasi antara minimal lama menyewa suatu kamar, dan harga memiliki korelasi yang paling tinggi dengan nilai koefisien korelasi sebesar 0.263.
Berikut merupakan visualisasi dari data minimal lama menyewa suatu kamar dengan harganya:
review_num_vs_price = px.scatter(data_frame=listing_by_room,x='review_num', y='price', color = 'room_type', trendline="ols", trendline_scope="overall", trendline_color_override="black", template="simple_white", width=750)
review_num_vs_price.update_layout(title="<b>Review_num vs Price</b>",title_font=dict(size=18, color="black"))
review_num_vs_price
Terihat bahwa semakin lama minimal sewa suatu kamar, maka akan semakin rendah harga penyewaan per malamnya. Kemungkinan pihak pemilik Kamar di Airbnb menawarkan paket semakin lama menginap maka harga yang ditawarkan semakin murah untuk menarik customer.
Diketahui bahwa harga, minimal lama sewa, lama suatu kamar tersewa dalam satu tahun, dan banyaknya review yang diperoleh dalam 5 tahun terakhir memiliki hubungan korelasi yang sangat rendah sehingga tidak dapat menyimpulkan bahwa variabel variable tersebut berhubungan. Sehingga, pebisnis lebih baik melakukan riset lanjutan dengan melihat fasilitas atau keunikan apa yang belum disediakan oleh kompetitor sehingga dapat lebih unggul dan menambah daya tarik pelanggan.
Untuk menentukan harga yang tepat untuk ditawarkan, pebisnis dapat melakukan pemodelan prediksi harga secara statistik, contohnya dengan model logistic regression, atau model regresi lain. Untuk mendapatkan prediksi yang lebih baik dan akurat, pebisnis dapat mengumpulkan kembali lebih banyak data, atau menambah variabel - variabel yang mungkin memiliki hubungan dengan harga, seperti fasilitas yang disediakan, berapa kamar yang ditawarkan, dan variable lain yang kiranya memiliki pengaruh terhadap harga.
!pip install jupyter-dash
Requirement already satisfied: jupyter-dash in c:\programdata\anaconda3\lib\site-packages (0.4.2) Requirement already satisfied: retrying in c:\programdata\anaconda3\lib\site-packages (from jupyter-dash) (1.3.4) Requirement already satisfied: ipython in c:\programdata\anaconda3\lib\site-packages (from jupyter-dash) (7.31.1) Requirement already satisfied: ansi2html in c:\programdata\anaconda3\lib\site-packages (from jupyter-dash) (1.8.0) Requirement already satisfied: ipykernel in c:\programdata\anaconda3\lib\site-packages (from jupyter-dash) (6.15.2) Requirement already satisfied: dash in c:\programdata\anaconda3\lib\site-packages (from jupyter-dash) (2.9.1) Requirement already satisfied: flask in c:\programdata\anaconda3\lib\site-packages (from jupyter-dash) (1.1.2) Requirement already satisfied: requests in c:\programdata\anaconda3\lib\site-packages (from jupyter-dash) (2.28.1) Requirement already satisfied: nest-asyncio in c:\programdata\anaconda3\lib\site-packages (from jupyter-dash) (1.5.5) Requirement already satisfied: dash-table==5.0.0 in c:\programdata\anaconda3\lib\site-packages (from dash->jupyter-dash) (5.0.0) Requirement already satisfied: dash-html-components==2.0.0 in c:\programdata\anaconda3\lib\site-packages (from dash->jupyter-dash) (2.0.0) Requirement already satisfied: dash-core-components==2.0.0 in c:\programdata\anaconda3\lib\site-packages (from dash->jupyter-dash) (2.0.0) Requirement already satisfied: plotly>=5.0.0 in c:\programdata\anaconda3\lib\site-packages (from dash->jupyter-dash) (5.9.0) Requirement already satisfied: Werkzeug>=0.15 in c:\programdata\anaconda3\lib\site-packages (from flask->jupyter-dash) (2.0.3) Requirement already satisfied: click>=5.1 in c:\programdata\anaconda3\lib\site-packages (from flask->jupyter-dash) (8.0.4) Requirement already satisfied: Jinja2>=2.10.1 in c:\programdata\anaconda3\lib\site-packages (from flask->jupyter-dash) (2.11.3) Requirement already satisfied: itsdangerous>=0.24 in c:\programdata\anaconda3\lib\site-packages (from flask->jupyter-dash) (2.0.1) Requirement already satisfied: jupyter-client>=6.1.12 in c:\programdata\anaconda3\lib\site-packages (from ipykernel->jupyter-dash) (7.3.4) Requirement already satisfied: psutil in c:\programdata\anaconda3\lib\site-packages (from ipykernel->jupyter-dash) (5.9.0) Requirement already satisfied: traitlets>=5.1.0 in c:\programdata\anaconda3\lib\site-packages (from ipykernel->jupyter-dash) (5.1.1) Requirement already satisfied: pyzmq>=17 in c:\programdata\anaconda3\lib\site-packages (from ipykernel->jupyter-dash) (23.2.0) Requirement already satisfied: tornado>=6.1 in c:\programdata\anaconda3\lib\site-packages (from ipykernel->jupyter-dash) (6.1) Requirement already satisfied: packaging in c:\programdata\anaconda3\lib\site-packages (from ipykernel->jupyter-dash) (21.3) Requirement already satisfied: matplotlib-inline>=0.1 in c:\programdata\anaconda3\lib\site-packages (from ipykernel->jupyter-dash) (0.1.6) Requirement already satisfied: debugpy>=1.0 in c:\programdata\anaconda3\lib\site-packages (from ipykernel->jupyter-dash) (1.5.1) Requirement already satisfied: pygments in c:\programdata\anaconda3\lib\site-packages (from ipython->jupyter-dash) (2.14.0) Requirement already satisfied: jedi>=0.16 in c:\programdata\anaconda3\lib\site-packages (from ipython->jupyter-dash) (0.18.1) Requirement already satisfied: backcall in c:\programdata\anaconda3\lib\site-packages (from ipython->jupyter-dash) (0.2.0) Requirement already satisfied: decorator in c:\programdata\anaconda3\lib\site-packages (from ipython->jupyter-dash) (5.1.1) Requirement already satisfied: colorama in c:\programdata\anaconda3\lib\site-packages (from ipython->jupyter-dash) (0.4.5) Requirement already satisfied: setuptools>=18.5 in c:\programdata\anaconda3\lib\site-packages (from ipython->jupyter-dash) (63.4.1) Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in c:\programdata\anaconda3\lib\site-packages (from ipython->jupyter-dash) (3.0.20) Requirement already satisfied: pickleshare in c:\programdata\anaconda3\lib\site-packages (from ipython->jupyter-dash) (0.7.5) Requirement already satisfied: urllib3<1.27,>=1.21.1 in c:\programdata\anaconda3\lib\site-packages (from requests->jupyter-dash) (1.26.11) Requirement already satisfied: certifi>=2017.4.17 in c:\programdata\anaconda3\lib\site-packages (from requests->jupyter-dash) (2022.9.14) Requirement already satisfied: idna<4,>=2.5 in c:\programdata\anaconda3\lib\site-packages (from requests->jupyter-dash) (3.3) Requirement already satisfied: charset-normalizer<3,>=2 in c:\programdata\anaconda3\lib\site-packages (from requests->jupyter-dash) (2.0.4) Requirement already satisfied: six>=1.7.0 in c:\programdata\anaconda3\lib\site-packages (from retrying->jupyter-dash) (1.16.0) Requirement already satisfied: parso<0.9.0,>=0.8.0 in c:\programdata\anaconda3\lib\site-packages (from jedi>=0.16->ipython->jupyter-dash) (0.8.3) Requirement already satisfied: MarkupSafe>=0.23 in c:\programdata\anaconda3\lib\site-packages (from Jinja2>=2.10.1->flask->jupyter-dash) (2.0.1) Requirement already satisfied: python-dateutil>=2.8.2 in c:\programdata\anaconda3\lib\site-packages (from jupyter-client>=6.1.12->ipykernel->jupyter-dash) (2.8.2) Requirement already satisfied: jupyter-core>=4.9.2 in c:\programdata\anaconda3\lib\site-packages (from jupyter-client>=6.1.12->ipykernel->jupyter-dash) (4.11.1) Requirement already satisfied: entrypoints in c:\programdata\anaconda3\lib\site-packages (from jupyter-client>=6.1.12->ipykernel->jupyter-dash) (0.4) Requirement already satisfied: tenacity>=6.2.0 in c:\programdata\anaconda3\lib\site-packages (from plotly>=5.0.0->dash->jupyter-dash) (8.0.1) Requirement already satisfied: wcwidth in c:\programdata\anaconda3\lib\site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython->jupyter-dash) (0.2.5) Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in c:\programdata\anaconda3\lib\site-packages (from packaging->ipykernel->jupyter-dash) (3.0.9) Requirement already satisfied: pywin32>=1.0 in c:\programdata\anaconda3\lib\site-packages (from jupyter-core>=4.9.2->jupyter-client>=6.1.12->ipykernel->jupyter-dash) (302)
from jupyter_dash import JupyterDash
from dash import html
from dash import dcc
app = JupyterDash(__name__)
# Design Layout
app.layout = html.Div([
html.Div(html.H1("Singapore Airbnb Analysis",style={'textAlign':'center', 'font-family':'Calibri','font-size':40,'color':'#1A0000'}))
,html.Img(src = 'https://www.johnlkong.com/wp-content/uploads/2018/01/hilton_hotel_header-720x245.jpg',style={'height': '40%','width': '100%','textAlign' : 'center'})
,html.P("author: Lutfia Husna Khoirunnisa (https://www.linkedin.com/in/lutfiahusnakhoirunnisa)",style={'textAlign':'center', 'font-family':'Calibri','font-style': 'italic','font-size':20,'color':'#1A0000','font-weight':'lighter'})
,html.Br()
,html.Div(
children = [html.H3('Bisnis Penginapan di Airbnb', style = {'textAlign':'Left', 'margin-left':30, 'font-family':'Calibri','font-style': 'italic','font-size':25,'color':'#1A0000','font-weight':'light'})
,html.Div(dcc.Markdown('''
Pada satu tahun terakhir ini, kasus covid-19 di dunia sudah cukup menurun.
Banyak aktivitas yang sebelumnya tidak dapat dilakukan karena adanya pandemi covid-19 kini telah mulai berjalan kembali, salah satu aktivitas
yang kini sudah mulai banyak dilakukan adalah traveling. Dengan mulai bergeraknya kembali industri pariwisata, para pebisnis mulai kembali melirik
sektor tersebut untuk mengambil peluang sebesar-besarnya. Salah satu bisnis yang sedang naik saat ini adalah bisnis penginapan.
Dengan kemajuan teknologi, kini pebisnis dipermudah dalam memasarkan penginapan dengan adanya suatu online market platform yaitu Airbnb.
Dengan adanya Airbnb ini tentu sangat membantu pemilik penginapan untuk berhubungan dengan customernya, dan membantu dalam memasarkan penginapannya.
Dengan mulai naiknya bisnis penginapan, tentu persaingan akan semakin ketat dan pebisnis perlu untuk melakukan riset terlebih dahulu sebelum melakukan investasi
agar dapat menetapkan strategi yang tepat untuk memperoleh keuntungan yang maksimal dan dapat bersaing dengan kompetitornya. Riset ini dapat dilakukan
dengan melihat bagaimana aktivitas bisnis pada beberapa tahun terakhir, untuk melihat bagaimana gambaran, dan mengetahui trendnya.
Pada artikel ini akan diberikan gambaran bagaimana aktivitas bisnis penginapan di Airbnb Singapura selama 5 tahun terakhir.
'''),style = {'textAlign':'Left', 'margin-left':30, 'margin-right':30,'display': 'inline-block', 'font-family':'Calibri','font-style': 'italic','font-size':17,'color':'#1A0000',
'font-weight':'light','textAlign': 'justify','text-justify': 'inter-word'})
]
)
,html.Div(children = [
html.H3('Bagaimana Aktivitas Penyewaan penginapan di Airbnb Singapura?', style = {'textAlign':'Left', 'margin-left':30, 'font-family':'Calibri','font-style': 'italic','font-size':23,'color':'#1A0000','font-weight':'light'})
,html.P('Aktivitas penyewaan penginapan di Airbnb Singapura jika dilihat dari aktivitas review di Airbnb', style = {'textAlign':'Left', 'margin-left':30, 'font-family':'Calibri','font-style': 'italic','font-size':20,'color':'#1A0000','font-weight':'light'})
,html.P('''
Tentu kita memiliki keterbatasan untuk mendapatkan data aktivitas penyewaan pada tiap penginapan di Airbnb, karena tentu data tersebut bersifat rahasia
milik tiap-tiap penyedia penginapan. Tetapi kita dapat melihat bagaimana gambaran umum dari aktivitas penyewaan dengan melihat aktivitas review yang
dilakukan oleh customer melalui platform Airbnb. Dengan melihat bagaimana gambaran dari aktivitas review penginapan di Airbnb, kita dapat melihat
bagaimana trend penyewaan dari tiap penginapan pada tiap waktunya.
''', style = {'textAlign':'Left', 'margin-left':30, 'margin-right':30,'display': 'inline-block', 'font-family':'Calibri','font-style': 'italic','font-size':17,'color':'#1A0000',
'font-weight':'light','textAlign': 'justify','text-justify': 'inter-word'})
,dcc.Tabs([
dcc.Tab(
label = 'Per Hari', children = [
dcc.Graph(id = 'rvw_by_date', figure = rvw_by_date,config={"displayModeBar": False})
]
),
dcc.Tab(
label = 'Per Bulan', children = [
dcc.Graph(id = 'rvw_by_month',figure = rvw_by_month, config = {"displayModeBar": False})
]
),
dcc.Tab(
label = 'Per Tahun', children = [
html.Div(dcc.Graph(id = 'rvw_by_year',figure = rvw_by_year,config = {"displayModeBar": False})
, style = {'width' : '60%', 'margin-left':300})
]
)
])
,html.Div(dcc.Markdown('''
Dapat dilihat bahwa banyak review penginapan tiap tahunnya, banyak review melonjak dari 2018 menuju 2019, kemudian turun drastis pada tahun 2020.
Hal ini sejalan dengan grafik 'Development of the tourism sector in Singapore from 1995 to 2020' yang dipublikasikan oleh www.worlddata.info, dimana
banyak turis yang masuk pada tahun 2019 mengalami kenaikan jika dibandingkan dengan tahun 2018, dan terjadi penurunan drastis pada tahun 2020.
Dengan banyak turis yang masuk ini tentu sangat berpengaruh dengan aktivitas review penginapan pada Airbnb di Singapura.
''', style = {'textAlign':'Left', 'margin-left':30, 'margin-right':30,'display': 'inline-block', 'font-family':'Calibri','font-style': 'italic','font-size':17,'color':'#1A0000',
'font-weight':'light','textAlign': 'justify','text-justify': 'inter-word'}))
,html.Img(src = 'https://cdn.worlddata.info/graphs/tourism/arrivals-singapur-930.png', style = {'width':'80%','display':'inline-block', 'margin-left':100})
,html.Div(dcc.Markdown('img source: https://cdn.worlddata.info/graphs/tourism/arrivals-singapur-930.png'), style = {'textAlign':'center', 'font-family':'Calibri','font-style': 'italic','font-size':20,'color':'#1A0000','font-weight':'light'})
,html.Div(dcc.Markdown('''
Penurunan aktivitas review kamar berlanjut pada tahun 2021, dimana pada tahun 2021 aktivitas review kamar Airbnb di
Singapura merupakan yang paling rendah selama 5 tahun terakhir. Tetapi terjadi kenaikan aktivitas review kamar Airbnb di Singapura pada tahun 2022.
Penurunan dan kenaikan ini mungkin disebabkan oleh adanya pandemi covid-19 yang dimulai pada tahun 2020 dan berlangsung hingga awal tahun 2022
yang menyebabkan terbatasnya aktivitas pariwisata di Singapura. Tentu hai ini berakibat pada aktivitas review penginapan Airbnb yang ada di Singapura. Dan pandemi covid-19 ini
kasus covid-19 berangsur menurun, sehingga aktivitas review kamar Airbnb kembali naik.
Jika dilihat dari banyak review penginapan per bulannya, pada bulan Desember hingga Januari tiap tahunnya pada 5 tahun terakhir cenderung lebih tinggi aktivitas reviewnya dibandingkan
dengan bulan-bulan lain. Hal ini tentu menarik, karena trend ini cenderung berulang pada 5 tahun terakhir.
'''),style = {'textAlign':'Left', 'margin-left':30, 'margin-right':30,'display': 'inline-block', 'font-family':'Calibri','font-style': 'italic','font-size':17,'color':'#1A0000',
'font-weight':'light','textAlign': 'justify','text-justify': 'inter-word'})
])
,html.Div([
html.H3('Bagaimana Penyebaran Penginapan di Singapura?', style = {'textAlign':'Left', 'margin-left':30, 'font-family':'Calibri','font-style': 'italic','font-size':25,'color':'#1A0000','font-weight':'light'})
,html.Div(
children = dcc.Graph(
id = 'fig_map2', figure = listing_map, config={"displayModeBar": False}),
style={'width': '60%', 'margin-left':'3%', 'display': 'inline-block'}
)
,html.Div(children = dcc.Markdown('''
Penginapan yang disediakan di Airbnb Singapura menyebar di seluruh wilayah Singapura, tetapi penginapan paling banyak berada pada Central Region.
Central Region sendiri merupakan pusat bisnis dan hiburan di Singapura, sehingga pembangunan penginapan di sini sangat menjanjikan
untuk dijadikan tempat untuk berbisnis penyewaan penginapan di Singapura. Tetapi tentu dengan banyaknya penginapan di Central Region,
tentu persaingan dengan kompetitor akan semakin ketat, maka perlu untuk merancang strategi yang baik untuk lebih unggul dari kompetitor.
Strategi yang baik sangat diperlukan untuk unggul dalam persaingan, contohnya seperti mengembangkan konsep penginapan yang unik
untuk menarik pengunjung, memperkuat marketing, dan fokus pada kualitas layanan serta kualitas kamar yang disewakan. Letak penginapan
yang strategis juga perlu dipertimbangkan, karena letak penginapan merupakan salah satu faktor
yang paling berpengaruh pada aktivitas penyewaan.
'''),
style={'vertical-align':'top', 'margin-left':10, 'width': '35%', 'display': 'inline-block', 'font-family':'Calibri','font-style': 'italic','font-size':17,'color':'#1A0000','font-weight':'light','textAlign': 'justify','text-justify': 'inter-word'}
)
])
,html.Div([
html.H3('Gambaran Umum pada Neighbourhood di Singapura', style = {'textAlign':'Left', 'margin-left':30, 'font-family':'Calibri','font-style': 'italic','font-size':25,'color':'#1A0000','font-weight':'light'})
,html.Div( dcc.Graph(
id = 'top5_nbhood_plot', figure = top_nbhood_plot, config={"displayModeBar": False}),
style={'width': '47%', 'display': 'inline-block', 'margin-left':30})
,html.Div(dcc.Graph(
id = 'rvw_by_neighbourhood_plot', figure = rvw_by_neighbourhood_plot, config={"displayModeBar": False}),
style={'width': '50%', 'display': 'inline-block'})
])
,html.Div(children = dcc.Markdown('''
Diketahui neighbourhood yang menyediakan penginapan terbanyak di Airbnb Singapura adalah
Kallang yang berada di Central Region. Karena memiliki banyak penginapan, Kallang juga mendapatkan akumulasi review penginapan paling banyak di Airbnb Singapura.
Kallang memiliki banyak daya tarik bagi wisatawan, seperti Sungai Kallang, dan tempat iconic lain seperti new National Stadium,
Kallang Wave Mall, dan Kallang menyediakan banyak fasilitas untuk melakukan aktivitas olahraga sehingga Kallang menjadi tempat yang memiliki daya tarik turis
dan menjanjikan untuk dijadikan tempat berbisnis penyewaan penginapan melalui Airbnb.
'''),
style={'vertical-align':'top', 'display': 'inline-block', 'font-family':'Calibri','font-style': 'italic','font-size':17,'color':'#1A0000',
'font-weight':'light','textAlign': 'justify','text-justify': 'inter-word','padding':7, 'margin-left':30, 'margin-right':30}
)
,html.Div([
html.H3("Bagaimana Gambaran Umum Mengenai Room Type di Airbnb Singapura?",style={'textAlign':'Left', 'margin-left':30, 'font-family':'Calibri','font-style': 'italic','font-size':25,'color':'#1A0000','font-weight':'light'})
,dcc.Tabs([
dcc.Tab(
label = 'Room type distribution', children = [
dcc.Graph(id = 'room_type_pie', figure = room_type_pie,config={"displayModeBar": False})
]
),
dcc.Tab(
label = 'Number of Reviews for Each Room Type', children = [
dcc.Graph(id = 'rvw_by_room_type',figure = rvw_by_room_type, config = {"displayModeBar": False})
]
),
dcc.Tab(
label = 'Price mean for Each Room Type', children = [
html.Div(dcc.Graph(id = 'price_by_roomtype_plot',figure = price_by_roomtype_plot,config = {"displayModeBar": False})
, style = {'width' : '60%', 'margin-left':300})
]
)
])
,html.Div(children = dcc.Markdown('''
Jenis kamar yang paling banyak di Airbnb Singapura adalah Private room dengan banyak kamar sebesar 47.4% dari total kamar.
Hal ini sesuai dengan aktivitas review Airbnb Singapura yang pada 5 tahun terakhir, dimana diketahui bahwa kamar dengan tipe Private room
selalu mendapatkan banyak review tertinggi di antara tipe kamar lainnya.
Dengan rata-rata harga 168 SGD, per malam yaitu nomor 2 terendah dibandingkan dengan tipe kamar lainnya, tipe kamar private room ini disewa
banyak customer di Singapura, dilihat dari banyak review yang ada pada Airbnb.
'''),
style={'textAlign':'Left', 'margin-left':30, 'margin-right':30,'display': 'inline-block', 'font-family':'Calibri','font-style': 'italic','font-size':17,'color':'#1A0000',
'font-weight':'light','textAlign': 'justify','text-justify': 'inter-word'}
)
])
,html.H3("Singaporean Airbnb Price Distribution and Rental Trend",style={'textAlign':'Left', 'margin-left':30, 'font-family':'Calibri','font-style': 'italic','font-size':25,'color':'#1A0000','font-weight':'light'})
,dcc.Tabs([
dcc.Tab(
label = 'Price Mapping', children = [
html.Div(dcc.Graph(
id = 'price_map', figure = price_map, config={"displayModeBar": False}
), style = {'width' : '60%', 'margin-left':300})
]
),
dcc.Tab(
label = 'Length of a Room is Rented in a Year Mapping', children = [
html.Div(dcc.Graph(
id = 'rented_365_map', figure = rented_365_map, config={"displayModeBar": False}
), style = {'width' : '60%', 'margin-left':300})
]
)
])
,html.Div(children = dcc.Markdown('''
Dari mapping plot harga tersebut, diketahui bahwa mayoritas dari penyewa penginapan di Airbnb memberikan harga dibawah 2000.
Distribusi harga ini menyebar, dan tidak bergantung pada dimana letak dari penginapan tersebut. Sehingga dapat dikatakan bahwa
posisi penginapan tidak berkorelasi dengan harga yang diberikan oleh penyewa. Pemberian harga ini kemungkinan lebih bergantung pada
fasilitas apa saja yang disediakan oleh penginapan dan juga bergantung pada kelas dari penginapan.
Begitu juga pada lama suatu kamar penginapan tersewa dalam satu tahun, pada mapping plot tersebut diketahui bahwa distribusinya menyebar dan tidak bergantung pada
letak penginapan. Dapat dilihat bahwa di daerah North-east Region memiliki sedikit penginapan yang disewakan, tetapi mayoritas memiliki lama penginapan tersewa
yang cenderung tinggi. Pada Central Region, terlihat sangat banyak penginapan yang disewakan tetapi memiliki lama penginapan tersewa dalam satu tahun yang
mayoritas relatif rendah. Hal ini mungkin terjadi karena banyaknya pilihan penginapan yang tersedia di kawasan Central Region, menjadikan turis lebih sering
berpindah pindah penginapan sehingga menyebabkan lama penginapan tersewa dalam satu tahun cenderung rendah.
'''),
style = {'textAlign':'Left', 'margin-left':30, 'margin-right':30,'display': 'inline-block', 'font-family':'Calibri','font-style': 'italic','font-size':17,'color':'#1A0000',
'font-weight':'light','textAlign': 'justify','text-justify': 'inter-word'})
,html.Div([
html.H3('Apa yang Memiliki Pengaruh Pada Banyak Review?',style={'textAlign':'Left', 'margin-left':30, 'font-family':'Calibri','font-style': 'italic','font-size':25,'color':'#1A0000','font-weight':'light'})
,html.Div(dcc.Graph(id = 'listing_corr2', figure = listing_corr2), style = {'width':'60%', 'margin-left':300})
,html.Div(dcc.Markdown('''
Terlihat dari nilai koefisien korelasi yang mendekati 0, antara minimal lama menyewa, harga, lama suatu kamar tersewa dalam satu tahun,
dan banyak review tidak ada yang memiliki korelasi kuat. Keempat variable tersebut berkorelasi sangat lemah terhadap satu sama lain.
Tetapi diantara korelasi variable-variable tersebut, korelasi antara minimal lama menyewa suatu kamar, dan harga memiliki korelasi yang
paling tinggi dengan nilai koefisien korelasi sebesar 0.263.
Jika dilihat dari koefisien korelasi, variable yang paling memiliki pengaruh pada banyak review adalah price.
Berikut merupakan visualisasi dari data banyak review dari suatu kamar dengan harganya:
'''), style = {'textAlign':'Left', 'margin-left':30, 'margin-right':30,'display': 'inline-block', 'font-family':'Calibri','font-style': 'italic','font-size':17,'color':'#1A0000',
'font-weight':'light','textAlign': 'justify','text-justify': 'inter-word'})
,html.Div(
dcc.Graph(id = 'review_num_vs_price', figure = review_num_vs_price), style = {'width':'60%', 'margin-left':300}
)
,html.Div(
dcc.Markdown('''
Terihat bahwa antara banyak review dan harga memiliki korelasi negatif, artinya semakin banyak review yang diperoleh
semakin rendah harga penyewaan per malamnya. Tetapi karena koefisien korelasi sangat kecil dan mendekati 0,
kita tetap tidak dapat memutuskan jika harga memiliki pengaruh terhadap banyak review.
'''), style = {'textAlign':'Left', 'margin-left':30, 'margin-right':30,'display': 'inline-block', 'font-family':'Calibri','font-style': 'italic','font-size':17,'color':'#1A0000',
'font-weight':'light','textAlign': 'justify','text-justify': 'inter-word'}
)
])
,html.Div([
html.H3('Business Recomendation',style={'margin':0,'textAlign':'Left', 'margin-left':30, 'font-family':'Calibri','font-style': 'italic','font-size':25,'color':'#1A0000','font-weight':'light'})
,html.Div(
dcc.Markdown('''
Diketahui bahwa harga, minimal lama sewa, lama suatu kamar tersewa dalam satu tahun, dan banyaknya review yang diperoleh dalam 5 tahun terakhir
memiliki hubungan korelasi yang sangat rendah sehingga tidak dapat menyimpulkan bahwa variabel variable tersebut berhubungan. Sehingga, pebisnis
lebih baik melakukan riset lanjutan dengan melihat fasilitas atau keunikan apa yang belum disediakan oleh kompetitor sehingga dapat lebih unggul
dan menambah daya tarik pelanggan.
Untuk menentukan harga yang tepat untuk ditawarkan, pebisnis dapat melakukan pemodelan prediksi harga secara statistik, contohnya dengan model
logistic regression, atau model regresi lain. Untuk mendapatkan prediksi yang lebih baik dan akurat, pebisnis dapat mengumpulkan kembali lebih
banyak data, atau menambah variabel - variabel yang mungkin memiliki hubungan dengan harga, seperti fasilitas yang disediakan, berapa kamar yang
ditawarkan, dan variable lain yang kiranya memiliki pengaruh terhadap harga.
'''), style = {'textAlign':'Left', 'margin-left':30, 'margin-right':30,'display': 'inline-block', 'font-family':'Calibri','font-style': 'italic','font-size':17,'color':'#1A0000',
'font-weight':'light','textAlign': 'justify','text-justify': 'inter-word'}
)
,html.Div([
html.H3('References',style={'margin':0,'textAlign':'Left', 'margin-left':30, 'font-family':'Calibri','font-style': 'italic','font-size':25,'color':'#1A0000','font-weight':'light'})
,html.Div(
dcc.Markdown('''
* https://www.airbnb.com/
* https://www.visitsingapore.com/see-do-singapore/
* https://www.worlddata.info/asia/singapore/tourism.php
'''), style = {'margin-top':0, 'margin-left':30, 'display': 'inline', 'font-family':'Calibri','font-style': 'italic','font-size':17,'color':'#1A0000',
'font-weight':'light','textAlign': 'justify','text-justify': 'inter-word'}
)
])
])
])
# Run Application
if __name__ == '__main__':
app.run_server()
Dash is running on http://127.0.0.1:8050/ Dash app running on http://127.0.0.1:8050/